/**
 * 柯理化：把接受多个参数的函数转换成接受一个单一参数的函数，并且返回接受余下的剩余参数并且返回结果的新函数
 */
// function sum (a, b) {
//     return a + b
// }
// sum(1, 2)

// ============== 改写成 sum(1)(2) ================
// 定义一个接受参数的函数
// 内部返回一个接受剩余参数的新函数，返回累加结果

function sum (a) {
    return function (b) {
        return a + b
    }
}
// console.log(sum(1)(9))

// ============ 面试题 ============
function sun (a, b, c, d, e) {
    return a + b + c + d + e
}
// 改写函数 sum 实现：传递到 5 个参数即可实现累加
// sum(1)(2)(3)(4)(5)
// sum(1,2)(3)(4)(5)
// sum(1,2,3)(4,5)
// sum(1,2,3,4,5)
/**
 * 思路：
 *  1.保存不定长参数 【剩余参数】
 *  2.判断参数个数
 *  2.1 参数到 5 累加
 *  2.2 参数不到 5 保存剩余参数
 */
function fn (type) {
    let list = []
    function sumToal (...rest) {
        list.push(...rest)
        if (list.length >= type) {
            const res = list.slice(0, type).reduce((p, v) => {
                return p + v
            }, 0)
            // 需要清空数组
            list = []
            return res
        } else {
            return sumToal
        }
    }
    return sumToal
}


console.log(fn(2)(1, 9))